﻿namespace Sofire.Data
{
    using System;
    using System.Collections.Generic;
    using System.Text;

    /// <summary>
    /// 表示将返回数据转换为实体的查询结果。
    /// </summary>
    /// <typeparam name="TValue">实体或实体集合的类型。</typeparam>
    public abstract class EntityResultBase<TValue> : QueryResultBase<TValue>
    {
        #region Fields

        /// <summary>
        /// 表示一个 <see cref="Sofire.Data.TableResult"/> 查询结果。
        /// </summary>
        protected TableResult _TableResult;

        #endregion Fields

        #region Constructors

        /// <summary>
        /// 初始化 <see cref="Sofire.Data.EntityResultBase&lt;TValue&gt;"/> 的新实例。
        /// </summary>
        /// <param name="tableResult">一个 <see cref="Sofire.Data.TableResult"/> 查询结果。</param>
        /// <param name="value">查询结果的返回值。</param>
        internal EntityResultBase(TableResult tableResult, TValue value)
        {
            this._destructor = false;
            this._TableResult = tableResult;
            this.Initialization(tableResult.QueryEngine
                                , tableResult.Command
                                , value
                                , tableResult.Exception);
        }

        #endregion Constructors

        #region Properties

        /// <summary>
        /// 获取一个值，表示一个 <see cref="Sofire.Data.TableResult"/> 查询结果。
        /// </summary>
        public TableResult TableResult
        {
            get
            {
                return this._TableResult;
            }
        }

        #endregion Properties

        #region Methods


        /// <summary>
        /// 重新将实体数据映射到对应的数据行，并保存到数据库。
        /// </summary>
        /// <returns>返回更新的行数。如果返回一个 0 则表示当前返回值并改动，如果返回一个小于 0 的整数，则表示更新发生了异常。</returns>
        public int Save()
        {
            return this.Save(true, false);
        }

        /// <summary>
        /// 保存到数据库。
        /// </summary>
        /// <param name="refresh">指示一个值，表示是否重新将实体数据映射到对应的数据行。</param>
        /// <returns>返回更新的行数。如果返回一个 0 则表示当前返回值并改动，如果返回一个小于 0 的整数，则表示更新发生了异常。</returns>
        public int Save(bool refresh)
        {
            return this.Save(refresh, false);
        }
        
        /// <summary>
        /// 保存到数据库。
        /// </summary>
        /// <param name="refresh">指示一个值，表示是否重新将实体数据映射到对应的数据行。</param>
        /// <param name="continueUpdateOnError">指示在行更新过程中遇到错误时是否生成异常。如果要继续更新而不生成异常，则为 true，否则为 false。</param>
        /// <returns>返回更新的行数。如果返回一个 0 则表示当前返回值并改动，如果返回一个小于 0 的整数，则表示更新发生了异常。</returns>
        public abstract int Save(bool refresh, bool continueUpdateOnError);

        /// <summary>
        /// 执行释放任务。
        /// </summary>
        protected override void Disposing()
        {
            base.Disposing();
            if(this._TableResult != null)
            {
                this._TableResult.Dispose();
                this._TableResult = null;
            }
        }

        #endregion Methods
    }
}